package ar.com.logic.components;

import java.util.List;
import java.util.Vector;

import ar.com.logic.components.exceptions.SinPosicionUnicaException;

public class Posiciones {
	private List<Integer> posiciones = new Vector<Integer>();
	private List<Integer> descartados = new Vector<Integer>();
	private Integer size;
	private Integer posicionUnica = 0;

	public Posiciones(Integer size, Boolean empiezaEnCero) {
		if (empiezaEnCero) {
			for (int i = 0; i < size; i++) {
				posiciones.add(i);
			}

		} else {
			for (int i = 1; i <= size; i++) {
				posiciones.add(i);
			}

		}
		this.size = size;
	}

	public List<Integer> getDisponibles() {
		return this.posiciones;
	}

	public List<Integer> getDescartados() {
		return this.descartados;
	}

	public void descartar(Integer posicion) {
		if (posiciones.contains(posicion)) {
			this.posiciones.remove(posicion);
			this.descartados.add(posicion);
			if (this.posiciones.size() == 1) {
				this.posicionUnica = this.posiciones.get(0);
			}
		}
	}

	public void descartar() {

		this.descartados.addAll(this.posiciones);
		this.posiciones.clear();
		this.posicionUnica = 0;
	}

	public void setPosicionUnica(Integer posicion) {
		this.posiciones.clear();
		this.posiciones.add(posicion);
		this.descartados.clear();
		for (int i = 0; i < size; i++) {
			if (i + 1 != posicion)
				this.descartados.add(i + 1);
		}
		this.posicionUnica = posicion;
	}

	public boolean hasPosicionUnica() {
		return this.posicionUnica != 0;
	}

	public Integer getPosicionUnica() {
		if (hasPosicionUnica()) {
			return this.posicionUnica;
		} else {
			throw new SinPosicionUnicaException();
		}
	}

	public boolean hasPosicionDisponible(Integer posicion) {

		return this.posiciones.contains(posicion);
	}

	public boolean esDescartado(Integer posicion) {

		return this.descartados.contains(posicion);
	}

	public boolean hasPosicionesDisponibles() {

		return this.posiciones.size() > 0;
	}

	@Override
	public String toString() {
		String s = "[";
		for (Integer posicion : posiciones) {
			if (!s.equals("[")) {
				s += ", " + posicion;
			} else {
				s += posicion;
			}
		}

		return s + "]";
	}

}
